package app.controllers;

import app.models.Funcionario;
import app.models.Paciente;
import app.models.Usuario;
import app.models.enums.StatusUsuario;
import app.services.FuncionarioService;
import app.services.PacienteService;
import app.services.UsuarioService;
import br.com.caelum.vraptor.Get;
import br.com.caelum.vraptor.Post;
import br.com.caelum.vraptor.Resource;
import br.com.caelum.vraptor.Result;
import br.com.caelum.vraptor.Validator;

@Resource
public class UsuarioController {

	private final Result result;
	private final UsuarioService service;
	private final Validator validator;
	private final FuncionarioService funcionarioService;
	private final PacienteService pacienteService;
	private final StatusUsuario STATUS_ATIVO = StatusUsuario.ATIVO;
	private final StatusUsuario STATUS_INATIVO = StatusUsuario.INATIVO;
	
	public UsuarioController(Result result,
	Validator validator, UsuarioService service, FuncionarioService funcionarioService, PacienteService pacienteService) {
		
		this.result = result;
		this.validator = validator;
		this.service = service;
		this.funcionarioService = funcionarioService;
		this.pacienteService = pacienteService;
	}
	
	
	@Get("/usuarios")
	public void index() {
		this.result.include("usuarioList", this.service.findAllOrdered());
		this.result.include("lastUsuariosRegistered", this.service.findLasUsuarios());	
	}
	
	
	@Get("/usuarios/find")
	public void index(String filter) {
		this.result.include("filter", filter);
		this.result.include("usuarioList", service.findUsuariosByFilter(filter));
		
		this.result.of(this).table();
	}
	
	
	@Get("/usuarios/{id}/edit")
	public void edit(Long id) {
		Funcionario funcionario = new Funcionario();
		funcionario = this.funcionarioService.findByUserId(id);
		Paciente paciente = new Paciente();
		paciente = this.pacienteService.findByUserId(id);
		if(funcionario != null){
			this.result.include("funcionario", funcionario);
		}
		if(paciente != null){
			this.result.include("paciente", paciente);
		}
		this.result.include("usuario", service.find(id));
	}
	
	
	@Post("/usuarios/update")
	public void update(Long userId, String usuario, String senha) {
		Usuario user = new Usuario();
		user = service.find(userId);
		user.setUsuario(usuario);
		user.setSenha(senha);
		validator.validate(user);
		validator.onErrorUsePageOf(this).edit(user.getId());
		service.update(user);
		
		this.result.redirectTo(this).index();
	}
	
	
	@Get("/usuarios/{id}/updateStatus")
	public void updateStatus(Long id) {
		Usuario usuario = new Usuario();
		usuario = service.find(id);
		
		if (STATUS_ATIVO.equals(usuario.getStatus())){
			usuario.setStatus(STATUS_INATIVO);
		} else {
			usuario.setStatus(STATUS_ATIVO);
		}
		
		this.service.update(usuario);
		this.result.forwardTo(this).index();
	}
	
	
	// Metódo para redirecionar para table.jsp
	public void table() { }
	
	
	@Get("/usuarios/{id}/show")
	public void show(Long id) {
		this.result.include("usuario", this.service.find(id));
	}
}